const app = getApp()

Page({
  data: {
    // 4x4网格数据，0表示空单元格
    grid: [
      [0, 0, 0, 0],
      [0, 0, 0, 0],
      [0, 0, 0, 0],
      [0, 0, 0, 0]
    ],
    // 游戏状态
    gameOver: false,
    // 触摸事件相关数据
    startX: 0,
    startY: 0
  },
  
  onLoad: function () {
    console.log('Welcome to Mini Code')
    this.initGame()
  },
  
  // 初始化游戏
  initGame: function() {
    // 重置网格
    const grid = [
      [0, 0, 0, 0],
      [0, 0, 0, 0],
      [0, 0, 0, 0],
      [0, 0, 0, 0]
    ]
    
    // 生成两个随机数字
    this.generateRandomNumber(grid)
    this.generateRandomNumber(grid)
    
    // 更新数据
    this.setData({
      grid: grid,
      gameOver: false
    })
  },
  
  // 重置游戏（新游戏按钮点击事件处理函数）
  resetGame: function() {
    console.log('重置游戏')
    this.initGame()
  },
  
  // 生成随机数字（2或4）
  generateRandomNumber: function(grid) {
    // 获取所有空单元格位置
    const emptyCells = []
    for (let i = 0; i < 4; i++) {
      for (let j = 0; j < 4; j++) {
        if (grid[i][j] === 0) {
          emptyCells.push({row: i, col: j})
        }
      }
    }
    
    // 如果没有空单元格，则返回
    if (emptyCells.length === 0) return
    
    // 随机选择一个空单元格
    const randomIndex = Math.floor(Math.random() * emptyCells.length)
    const cell = emptyCells[randomIndex]
    
    // 生成数字2或4（90%概率生成2，10%概率生成4）
    const value = Math.random() < 0.9 ? 2 : 4
    
    // 在选中的单元格中放置数字
    grid[cell.row][cell.col] = value
  },
  
  // 触摸开始事件处理函数
  touchStart: function(e) {
    if (this.data.gameOver) return
    
    // 记录起始触摸点坐标
    this.setData({
      startX: e.touches[0].clientX,
      startY: e.touches[0].clientY
    })
  },
  
  // 触摸结束事件处理函数
  touchEnd: function(e) {
    if (this.data.gameOver) return
    
    // 计算滑动距离
    const endX = e.changedTouches[0].clientX
    const endY = e.changedTouches[0].clientY
    const deltaX = endX - this.data.startX
    const deltaY = endY - this.data.startY
    
    // 设置滑动阈值（10像素）
    const threshold = 10
    
    // 判断滑动方向
    if (Math.abs(deltaX) > Math.abs(deltaY) && Math.abs(deltaX) > threshold) {
      // 水平滑动
      if (deltaX > 0) {
        // 右滑
        this.moveRight()
      } else {
        // 左滑
        this.moveLeft()
      }
    } else if (Math.abs(deltaY) > Math.abs(deltaX) && Math.abs(deltaY) > threshold) {
      // 垂直滑动
      if (deltaY > 0) {
        // 下滑
        this.moveDown()
      } else {
        // 上滑
        this.moveUp()
      }
    }
  },
  
  // 向左移动
  moveLeft: function() {
    console.log('向左移动')
    const grid = JSON.parse(JSON.stringify(this.data.grid)) // 深拷贝网格数据
    let moved = false
    
    // 对每一行进行操作
    for (let i = 0; i < 4; i++) {
      // 移动并合并
      const result = this.moveAndMergeRow(grid[i])
      grid[i] = result.row
      if (result.moved) moved = true
    }
    
    // 如果有移动，则生成新数字并检查游戏是否结束
    if (moved) {
      this.generateRandomNumber(grid)
      this.setData({ grid: grid })
      this.checkGameOver()
    }
  },
  
  // 向右移动
  moveRight: function() {
    console.log('向右移动')
    const grid = JSON.parse(JSON.stringify(this.data.grid)) // 深拷贝网格数据
    let moved = false
    
    // 对每一行进行操作
    for (let i = 0; i < 4; i++) {
      // 反转行，应用左移逻辑，再反转回来
      let row = grid[i].slice().reverse()
      const result = this.moveAndMergeRow(row)
      grid[i] = result.row.reverse()
      if (result.moved) moved = true
    }
    
    // 如果有移动，则生成新数字并检查游戏是否结束
    if (moved) {
      this.generateRandomNumber(grid)
      this.setData({ grid: grid })
      this.checkGameOver()
    }
  },
  
  // 向上移动
  moveUp: function() {
    console.log('向上移动')
    const grid = JSON.parse(JSON.stringify(this.data.grid)) // 深拷贝网格数据
    let moved = false
    
    // 对每一列进行操作
    for (let j = 0; j < 4; j++) {
      // 提取列
      let column = [grid[0][j], grid[1][j], grid[2][j], grid[3][j]]
      // 移动并合并
      const result = this.moveAndMergeRow(column)
      // 更新列
      for (let i = 0; i < 4; i++) {
        grid[i][j] = result.row[i]
      }
      if (result.moved) moved = true
    }
    
    // 如果有移动，则生成新数字并检查游戏是否结束
    if (moved) {
      this.generateRandomNumber(grid)
      this.setData({ grid: grid })
      this.checkGameOver()
    }
  },
  
  // 向下移动
  moveDown: function() {
    console.log('向下移动')
    const grid = JSON.parse(JSON.stringify(this.data.grid)) // 深拷贝网格数据
    let moved = false
    
    // 对每一列进行操作
    for (let j = 0; j < 4; j++) {
      // 提取列并反转
      let column = [grid[0][j], grid[1][j], grid[2][j], grid[3][j]].reverse()
      // 移动并合并
      const result = this.moveAndMergeRow(column)
      // 更新列（反转回来）
      column = result.row.reverse()
      for (let i = 0; i < 4; i++) {
        grid[i][j] = column[i]
      }
      if (result.moved) moved = true
    }
    
    // 如果有移动，则生成新数字并检查游戏是否结束
    if (moved) {
      this.generateRandomNumber(grid)
      this.setData({ grid: grid })
      this.checkGameOver()
    }
  },
  
  // 移动并合并一行（或一列）
  moveAndMergeRow: function(row) {
    const originalRow = row.slice() // 保存原始行
    let moved = false
    
    // 移除所有0
    row = row.filter(cell => cell !== 0)
    
    // 合并相邻且相同的数字
    for (let i = 0; i < row.length - 1; i++) {
      if (row[i] === row[i + 1]) {
        row[i] *= 2
        row[i + 1] = 0
        moved = true
        i++ // 跳过下一个数字，因为它已经被合并
      }
    }
    
    // 再次移除所有0
    row = row.filter(cell => cell !== 0)
    
    // 补充0
    while (row.length < 4) {
      row.push(0)
    }
    
    // 检查是否有移动
    for (let i = 0; i < 4; i++) {
      if (row[i] !== originalRow[i]) {
        moved = true
        break
      }
    }
    
    return { row, moved }
  },
  
  // 检查游戏是否结束
  checkGameOver: function() {
    const grid = this.data.grid
    
    // 检查是否有空单元格
    for (let i = 0; i < 4; i++) {
      for (let j = 0; j < 4; j++) {
        if (grid[i][j] === 0) {
          return // 有空单元格，游戏未结束
        }
      }
    }
    
    // 检查是否有相邻且相同的数字
    for (let i = 0; i < 4; i++) {
      for (let j = 0; j < 4; j++) {
        // 检查右侧相邻单元格
        if (j < 3 && grid[i][j] === grid[i][j + 1]) {
          return // 有可合并的数字，游戏未结束
        }
        // 检查下方相邻单元格
        if (i < 3 && grid[i][j] === grid[i + 1][j]) {
          return // 有可合并的数字，游戏未结束
        }
      }
    }
    
    // 没有空单元格且没有可合并的数字，游戏结束
    console.log('游戏结束')
    this.setData({ gameOver: true })
  }
})